package ch03
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.utils.setTimeout;
	
	import mx.events.ResizeEvent;
	import utils.Arrow;

	/**
	 * 使箭头跟着鼠标移动
	 * @author jianping.shenjp
	 * @date 2010-12-1
	 */
	public class RotateToMouse extends Sprite
	{

		private var arrow:Arrow;

		public function RotateToMouse()
		{
			super();
			if (stage)
			{
				addedToStageHandler();
			}
			else
			{
				this.addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
			}
		}

		private function addedToStageHandler(event:Event=null):void
		{
			this.removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
			/**
			 * 如果将 Stage.scaleMode 属性的值设置 StageScaleMode.NO_SCALE，需要为 resize 事件添加事件侦听器，
			 * 在回调函数中使用 Stage 类的 stageWidth和stageHeight 属性来确定调整大小后的 Flash Player 窗口的实际像素尺寸。
			 * 
			 */
			stage.scaleMode=StageScaleMode.NO_SCALE;
			stage.align=StageAlign.TOP_LEFT;

			trace("1:" + stage.width + " _ " + stage.stageWidth);
			/**
			 * 注意：
			 * 设置StageScaleMode.NO_SCALE并监听 resize 事件通常只在IE6下有效。
			 * 
			 * 采用延时处理效果较好。
			 * */
			//stage.addEventListener(Event.RESIZE, resizeHandler);
			setTimeout(resizeHandler,500);
		}

		/**
		 * Event.RESIZE的回调函数.
		 * 如果将 Stage.scaleMode 属性的值设置 StageScaleMode.NO_SCALE,
		 * stage.stageWidth 和 stage.stageHeight必须在Event.RESIZE回调函数中获得，否则会得到0的结果.
		 * @param event
		 */
		private function resizeHandler(event:Event=null):void
		{
			trace("2:"+stage.width + " _ " + stage.stageWidth+" _ "+stage.stageHeight);
			/**
			 * 这里必须对stage.stageWidth 与 stage.stageHeight进行一次判断，因为设置stage.scaleMode=StageScaleMode.NO_SCALE，
			 * Event.RESIZE的回调函数会连续发生两次，第一次stage.stageWidth 与 stage.stageHeight都为0，第二次才正常.
			 * */
			if (stage.stageWidth && stage.stageHeight > 0)
			{
				stage.removeEventListener(Event.RESIZE, resizeHandler);
				init();
			}
		}

		private function init():void
		{
			arrow=new Arrow();
			arrow.x=stage.stageWidth / 2;
			arrow.y=stage.stageHeight / 2;
			addChild(arrow);
			this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}

		/**
		 * 在Event.ENTER_FRAME的回调函数中使得箭头始终指向鼠标.
		 * @param event
		 *
		 */
		private function enterFrameHandler(event:Event):void
		{
			var dx:Number=mouseX - arrow.x;
			var dy:Number=mouseY - arrow.y;
			/**
			 * 计算角度必须使用atan2，如果使用atan的话，正负角度区分不了，指向就会不正确
			 * */
			//radians必须为Number，为int的话会很不准确.
			var radians:Number=Math.atan2(dy, dx);
			arrow.rotation=radians * 180 / Math.PI;
		}
	}
}